package com.tutorial.demo4stream;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

/**
 * @author xiaoxiaokui
 * @description: Parallel-Streams 并行流
 * stream 流是支持顺序和并行的。顺序流操作是单线程操作，
 * 而并行流是通过多线程来处理的，能够充分利用物理机
 * 多核 CPU 的优势，同时处理速度更快
 * @date 2019/10/30
 **/
public class Demo4ParallelStreams {
    public static void main(String[] args) {
        // 首先，我们创建一个包含 1000000 UUID list 集合
        int max = 1000000;
        List<String> values = new ArrayList<>(max);
        for (int i = 0; i < max; i++) {
            UUID uuid = UUID.randomUUID();
            values.add(uuid.toString());
        }

        // 分别通过顺序流和并行流，对这个 list 进行排序，测算耗时:

        // 顺序流排序
        // 纳秒
        long t0 = System.nanoTime();
        long count = values.stream().sorted().count();
        System.out.println(count);
        long t1 = System.nanoTime();

        // 纳秒转微妙
        long millis = TimeUnit.NANOSECONDS.toMillis(t1 - t0);
        System.out.println(String.format("顺序流排序耗时：%d ms", millis));

        // 并行流排序
        // 纳秒
        t0 = System.nanoTime();
        count = values.parallelStream().sorted().count();
        System.out.println(count);
        t1 = System.nanoTime();
        // 纳秒转微妙
        millis = TimeUnit.NANOSECONDS.toMillis(t1 - t0);
        System.out.println(String.format("并行流排序耗时：%d ms", millis));

        // 正如你所见，同样的逻辑处理，通过并行流，
        // 我们的性能提升了近 50%。完成这一切，
        // 我们需要做的仅仅是将 stream 改成了 parallelStream

    }
}
